home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / art&graf.ix / art-0018 / neo2mono / neo2mono.c next >
C/C++ Source or Header  |  1997-04-16  |  6KB  |  187 lines

  1. /****************************************************************************
  2.  * NEO2MONO                                   Version:   31.03.86
  3.  * geschrieben von:  Thomas Weinstein                    08.05.86
  4.  *                   Koenigsberger Str. 29d
  5.  *                   7500 Karlsruhe 1
  6.  *
  7.  * Konvertiert Neochromebilder (320 * 200) fuer
  8.  * Monochrome Bildschirm (640 * 400).
  9.  * Farben werden durch Grauabstufungen angenaehert.
  10.  *
  11.  ****************************************************************************/
  12.  
  13. /*
  14.  * DEFINES
  15.  */
  16.  
  17. #define  printline(s)                      gemdos(0x09,s);
  18. #define  create(name,mode)                 gemdos(0x3c,name,mode)
  19. #define  open(name,att)                    gemdos(0x3d,name,att)
  20. #define  close(hndl)                       gemdos(0x3e,hndl)
  21. #define  read(hndl,size,buff)    (long)    gemdos(0x3f,hndl,size,buff)
  22. #define  write(hndl,size,buff)   (long)    gemdos(0x40,hndl,size,buff)
  23. #define  Log_base()              (short *) xbios(0x03)
  24. #define  Wait()                            gemdos(0x01)
  25.  
  26. #define  C_OFF       "\033f"
  27. #define  C_ON        "\033e"
  28. /*
  29.  * GLOBALE VARIABLE, FUNKTIONEN
  30.  */
  31.  
  32. long     gemdos();
  33. long     xbios();
  34. short    buff[16000];      /* Puffer fuer Neochrome Farbbild */
  35. short    *logbase;         /* Bildschirm Basisadresse        */
  36.  
  37. /*
  38.  * MAIN
  39.  */
  40. main(argc,argv) char **argv;
  41. {
  42.      short wflag = 0;
  43.  
  44.      logbase   =  Log_base();  /* hole logische Bildschirmbasis */
  45.      printline(C_OFF);         /* Cursor ausschalten.           */
  46.  
  47.      if (argc == 3)  /* Programmname + 2 Argumente */
  48.        if (!strcmp(argv[1],"-w")) {
  49.                              wflag++;
  50.                              argc--;
  51.                              argv++;
  52.         }
  53.  
  54.      if (argc == 2) {
  55.          if (load_file(argv[1])) {;   /* Neochromebild laden           */
  56.                           convert();  /* Konvertieren                  */
  57.                           if (wflag)
  58.                              save_file(argv[1]); /* Grauwertbild speichern */
  59.                           Wait();
  60.          } else
  61.             printline("Fehler beim Einlesen aufgetreten\n");
  62.       } else {
  63.          printline( "USAGE: hilow [-w] <filename.neo>\n");
  64.          Wait();
  65.       }
  66.       printline(C_ON);              /* Cursor einschalten            */
  67. } /* MAIN */
  68.  
  69.  
  70. /*
  71.  * Laedt Datei 'name' nach 'buff'. Keine Pruefung ob gueltige Neochromedatei
  72.  */
  73.  
  74. load_file(name)   char *name;
  75. {
  76.    short hndl;
  77.  
  78.        if ((hndl = open(name,0)) < 0) {
  79.           printline("Kann Datei nicht oeffnen!\n");
  80.           Wait();
  81.           exit(1);
  82.        }
  83.        read(hndl,128L,buff);   /* Header lesen       */
  84.        if (read(hndl,32000L,buff) < 0L) { /* Bilddatei einlesen */
  85.          printline("Fehler beim Lesen\n");
  86.          Wait();
  87.          return(0);
  88.        }
  89.        close(hndl);            /* Datei Schliessen   */
  90.  
  91.        return(1);
  92. }
  93.  
  94. /*
  95.  * Schreibt konvertiertes Bild nach <Filename.mon>
  96.  */
  97.  
  98. save_file(name) char *name;
  99. {
  100.    char  *strcat(), *strchr(), *help; 
  101.    short hndl;
  102.  
  103.    if ((help = strchr(name,'.')) == (char *) 0) {
  104.        printline(" Kein '.' in Eingabedateiname ");
  105.        return;
  106.    }
  107.  
  108.    *++help = '\0';      /* Extension abschneiden   */
  109.    strcat(name,"mon");  /* 'mon' ans Ende kopieren */
  110.  
  111.    if ((hndl = create(name,0)) < 0) {
  112.        printline("Kann Datei nicht zum Schreiben oeffnen");
  113.        return;
  114.    }
  115.  
  116.    if (write(hndl,32000L,logbase) < 0) {
  117.        printline("Kann Bild nicht schreiben");
  118.        return;
  119.    }
  120.    close(hndl);
  121. }
  122.  
  123.  
  124. /*
  125.  * Konvertiert Neochromebild in Monochrome Grauwertbild
  126.  */
  127.  
  128. convert()
  129. {
  130.    register long  l1,l2,*ptr1,*ptr2;  /* Hilfsvariable fuer Grauwertbildung */
  131.    register short *word, bit;
  132.    register short color,x,y;          /* Laufvariablen fuer Farbbild        */
  133.  
  134.    ptr1 = (long *) logbase;           /* Zeiger auf 1. Zeile Grauwertbild   */
  135.    ptr2 = (long *) logbase + 20;      /* Zeiger auf 2. Zeile Grauwertbild   */
  136.  
  137.    word = &buff[0];
  138.    for (y=0; y <= 16000; y += 80) {  /* Ueber Zeilen von Farbild laufen */
  139.       for (x=0; x < 80; x += 4) {    /* Zeile konvertieren. Immer vier  */
  140.                                      /* 16 Bit Worte geben 16 Pixel     */
  141.             l1 = l2 = 0L;
  142.             for (bit = 15; bit >= 0; bit--) { /* 16 Bit Wort untersuchen   */
  143.             color =  test(word,bit);          /* test liefert 0 - 4        */
  144.             l1 <<= 2; l2 <<= 2;               /* Grauwert 2 Bit nach links */
  145.               switch (color) {                /* Ergibt folgende Grauwerte:*/
  146.                 case 4:
  147.                     l1 += 3;                  /*   XX         X = schwarz  */
  148.                     l2 += 3;                  /*   XX         0 = weiss    */
  149.                     break;
  150.                 case 3:
  151.                     l1 += 3;                  /*   XX                      */
  152.                     l2 += 2;                  /*   X0                      */
  153.                     break;
  154.                 case 2:
  155.                     l1 += 2;                  /*   X0                      */
  156.                     l2 += 1;                  /*   0X                      */
  157.                     break;
  158.                 case 1:
  159.                     l1 += 1;                  /*   0X                      */
  160.               }                               /*   00                      */
  161.             }
  162.             *ptr1++ = l1;  *ptr2++ = l2; /* In Bildspeicher schreiben */
  163.             word += 4;                   /* Die naechsten 4 Worte     */
  164.       }
  165.       ptr1 += 20; ptr2 += 20;
  166.    }
  167. }
  168.  
  169. /*
  170.  * liefert 0 - 4 je nachdem wieviel Farbbits fuer Pixel gesetzt sind
  171.  */
  172.  
  173. test(word,bit)
  174. register short *word;
  175. short bit;
  176. {
  177.    register short shift;
  178.  
  179.           shift = 1 << bit;
  180.  
  181.           return (((*word    & shift) ? 1 : 0) +
  182.                  ((*(word+1) & shift) ? 1 : 0) +
  183.                  ((*(word+2) & shift) ? 1 : 0) +
  184.                  ((*(word+3) & shift) ? 1 : 0));
  185. }
  186. /* ENDE VON HILOW.TTP */
  187.